package com.ley.springboot.commons.utils;

import org.springframework.util.StringUtils;

import java.nio.charset.Charset;

/**
 * byte hex utility class
 **/
public class ByteHexUtils {

    /**
     * @param hex
     * @return
     * @description 将16进制转换为二进制
     */
    public static byte[] hex2Bytes(String hex) {
        if (hex.length() < 1)
            return null;
        int length = hex.length();
        byte[] bytes = new byte[length / 2];
        for (int i = 0; i < length; i = i + 2) {
            String subStr = hex.substring(i, i + 2);
            boolean negative = false; // 是否为负数
            int inte = Integer.parseInt(subStr, 16);
            if (inte > 127) {
                negative = true;
            }
            if (inte == 128) {
                inte = -128;
            } else if (negative) {
                inte = 0 - (inte & 0x7F);
            }
            byte result$i = (byte) inte;
            bytes[i / 2] = result$i;
        }
        return null;
    }

    /**
     * 二进制转换为16机制 <br>
     * 十六进制使用0~9,A~F进行表示 <br>
     * * 每一个byte包含8位二进制数据,由于Java中没有无符号整型, 因此8位中有一位是符号类型,需要将符号位转换为对应的数值,在转换为对应的
     * 16进制.8位2进制可以转换为2位16进制,不足2位进行补0,而解码时, 需要将符号位进行还原,再对数值进行转换
     **/
    public static String bytes2Hex(byte[] bytes) {
        StringBuilder hex = new StringBuilder();
        for (int i = 0; i < bytes.length; i++) {
            byte result$i = bytes[i];
            boolean negative = false; // 是否为负数
            if (result$i < 0) {
                negative = true;
            }
            int inte = Math.abs(result$i);
            if (negative) {
                inte = inte | 0x80; // 负数转换为正数(最高位的负号变为数值计算),再转为16进制
            }
            String temp = Integer.toHexString(bytes[i] & 0xFF);
            if (temp.length() == 1) {
                temp = '0' + temp;
            }
            hex.append(temp.toLowerCase());
        }
        return hex.toString();
    }
}
